#include <algorithm>
#include <cmath>
#include <cstdio>

const int N = 100005;
int n, m, stk[N];

struct Node {
  double x, y;
  inline bool operator<(const Node &rhs) const { return x == rhs.x ? y < rhs.y : x < rhs.x; }
} a[N];

inline double cross(Node A, Node B, Node C, Node D) {
  return (A.x - B.x) * (C.y - D.y) - (C.x - D.x) * (A.y - B.y);
}

inline double getdis(Node a, Node b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen("testdata.in", "r", stdin);
  freopen("testdata.out", "w", stdout);
#endif
#ifndef LOCAL
  freopen("CppTest.in", "r", stdin);
  freopen("CppTest.out", "w", stdout);
#endif
#endif

  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%lf%lf", &a[i].x, &a[i].y);
  }
  std::sort(a + 1, a + n + 1);
  int tail = 2;
  stk[1] = 1, stk[2] = 2;
  for (int i = 3; i <= n; ++i) {
    while (tail > 1 && cross(a[i], a[stk[tail]], a[stk[tail]], a[stk[tail - 1]]) < 0.0) --tail;
    stk[++tail] = i;
  }
  double ans = 0.0;
  for (int i = 1; i < tail; ++i) {
    ans += getdis(a[stk[i]], a[stk[i + 1]]);
  }
  tail = 2;
  stk[1] = n, stk[2] = n - 1;
  for (int i = n - 2; i; --i) {
    while (tail > 1 && cross(a[i], a[stk[tail]], a[stk[tail]], a[stk[tail - 1]]) < 0.0) --tail;
    stk[++tail] = i;
  }
  for (int i = 1; i < tail; ++i) {
    ans += getdis(a[stk[i]], a[stk[i + 1]]);
  }
  printf("%.2lf", ans);
  return 0;
}